home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 7
/
Amiga Format AFCD07 (Dec 1996, Issue 91).iso
/
serious
/
shareware
/
programming
/
ixemul-complete
/
ixemul
/
library
/
ix_exec_entry.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-05-08
|
4KB
|
131 lines
/*
* This file is part of ixemul.library for the Amiga.
* Copyright (C) 1991, 1992 Markus M. Wild
* Portions Copyright (C) 1995 Jeff Shepherd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* ix_exec_entry.c,v 1.1.1.1 1994/04/04 04:30:55 amiga Exp
*
* ix_exec_entry.c,v
* Revision 1.1.1.1 1994/04/04 04:30:55 amiga
* Initial CVS check in.
*
* Revision 1.3 1992/08/09 20:47:19 amiga
* call main thru exit, or no atexit handlers will be called!
*
* Revision 1.2 1992/07/04 19:13:42 mwild
* add SIGWINCH handler installation/removal
*
* Revision 1.1 1992/05/14 19:55:40 mwild
* Initial revision
*
*/
#define _KERNEL
#include "ixemul.h"
#include "kprintf.h"
#include <sys/wait.h>
#include <string.h>
int
ix_exec_entry (int argc, char **argv, char **environ, int *real_errno,
int (*main)(int, char **, char **))
{
struct Process *me = (struct Process *) SysBase->ThisTask;
/* we're coming from another process here, either after vfork() or from a
* process that wants to `replace' itself with this program. Thus the fpu
* is probably already initialized to some bogus state. That's why we
* HAVE to restore it into a default state here. */
if (gotanfpu())
resetfpu();
if (is_ixconfig(argv[0]))
{
u.p_xstat = W_EXITCODE(20, 0);
return u.p_xstat;
}
/* a program started by ix_exec_entry() must have some ix'like shell
around, that takes care of printing exit-states, so don't print them
again in sig_exit() */
u.u_argline = 0;
u.u_arglinelen = 0;
/* put some AmiTCP and AS225 stuff in here since it can't go into ix_open
* I need a pointer to the REAL errno
*/
if (real_errno)
{
u.u_errno = real_errno;
if (u.u_ixnetbase)
netcall(NET_set_errno, real_errno, NULL);
}
KPRINTF (("&errno = %lx\n", real_errno));
if (!_setjmp (u.u_jmp_buf))
{
/* install the signal mask that was active before execve() was called */
syscall (SYS_sigsetmask, u.u_oldmask);
/* this is not really the right thing to do, the user should call
ix_get_vars2 () to initialize environ to the address of the variable
in the calling program. However, this setting guarantees that
the user area entry is valid for getenv() calls. */
u.u_environ = &environ;
ix_install_sigwinch ();
/* If this process is traced (under debugger control)
then cause a sigtrap. */
if (u.p_flag & STRC)
{
KPRINTF(("ix_exec_entry(): STRC: _psignal (me=%08lx, SIGTRAP);\n", (long)me));
_psignal ((struct Task *) me, SIGTRAP);
/* A context switch is guaranteed to have taken place at this time,
since we signalled ourselves. As we are continuing now, it means
the debugger process has told us to continue. */
}
/* the first time thru call the program */
exit (main (argc, argv, environ));
/* not reached! */
}
/* we came from a longjmp-call */
ix_remove_sigwinch ();
return u.p_xstat;
}
/* ixconfig is no longer supported and can actually crash ixemul, so
abort if the user tries to start ixconfig. */
int is_ixconfig(char *prog)
{
int len;
if ((len = strlen(prog)) <= 8 || strchr("/:", prog[len - 9]))
if (len >= 8 && !stricmp(&prog[len - 8], "ixconfig"))
{
ix_panic("Please use ixprefs instead of ixconfig!");
return 1;
}
return 0;
}